package hash算法实现;


import java.util.SortedMap;
import java.util.TreeMap;

/**
 * 服务器一致性hash的算法demo实现
 * @author oyz
 */
public class ConsistentHashNoVirtual {



    public static void main(String[] args) {

        SortedMap<Integer,String> map = new TreeMap<>();
        // step1 初始化:把服务器节点IP的哈希值对应到哈希环上
        // 定义服务器ip
        String [] tomcatServer = new String[]{"127.0.0.1","125.241.5.2","213.123.4.6","124.54.34.7"};
        for(String ip:tomcatServer){
            // 取绝对值
            int hash = Math.abs(ip.hashCode());
            // 存储hash值与ip的对应关系
            map.put(hash,ip);
        }

        // step2 针对客户端IP求出hash值
        // 定义客户端IP
        String [] clients = {"10.78.12.3","113.25.63.1","126.12.3.8"};
        for(String client:clients){
            int clientHash = Math.abs(client.hashCode());
            // step3 针对客户端,找到能够处理请求的服务器(哈希环上顺时针最近)
            // 根据客户端ip的哈希值去找出哪一个服务器节点能够处理
            SortedMap<Integer, String> integerStringSortedMap = map.tailMap(clientHash);
            if(integerStringSortedMap.isEmpty()){
                Integer firstKey = map.firstKey();
                System.out.println("===========>>>客户端:"+client+"被路由到服务器:"+map.get(firstKey));
            }else{
                Integer firstKey = integerStringSortedMap.firstKey();
                System.out.println("===========>>>客户端:"+client+"被路由到服务器:"+map.get(firstKey));
            }

        }

    }
}
